home *** CD-ROM | disk | FTP | other *** search
/ Collection of Internet / Collection of Internet.iso / infosrvr / doc / www_talk.arc / 000109_connolly@pixel.convex.com _Sat Jun 6 07:56:12 1992.msg < prev    next >
Internet Message Format  |  1992-11-30  |  18KB

  1. Return-Path: <connolly@pixel.convex.com>
  2. Received: from dxmint.cern.ch by  nxoc01.cern.ch  (NeXT-1.0 (From Sendmail 5.52)/NeXT-2.0)
  3.     id AA07371; Sat, 6 Jun 92 07:56:12 MET DST
  4. Received: by dxmint.cern.ch (dxcern) (5.57/3.14)
  5.     id AA16481; Sat, 6 Jun 92 07:54:08 +0200
  6. Received: from pixel.convex.com by convex.convex.com (5.64/1.35)
  7.     id AA24856; Sat, 6 Jun 92 00:53:24 -0500
  8. Received: from localhost by pixel.convex.com (5.64/1.28)
  9.     id AA23369; Sat, 6 Jun 92 00:53:21 -0500
  10. Message-Id: <9206060553.AA23369@pixel.convex.com>
  11. To: www-talk@nxoc01.cern.ch
  12. Mime-Version: 1.0
  13. Content-Type: multipart/mixed; boundary=-
  14. Subject: MIME as a hypertext architecture
  15. Date: Sat, 06 Jun 92 00:53:20 CDT
  16. From: Dan Connolly <connolly@pixel.convex.com>
  17.  
  18. NOTE: This message uses existing and proposed MIME structuring
  19. conventions. Some parts of it may look strange on pre-MIME viewers.
  20.  
  21. ---
  22.  
  23. The WWW project needs an architecture for interchange of structured
  24. multimedia hypertext documents. The original architecture, HTML,
  25. introduced some structuring conventions and a way of specifying
  26. hypertext links.
  27.  
  28. The HTML format is under stress from several issues:
  29.     * We need an SGML DTD so that we can parse HTML using
  30.     something besides the public implementation of WWW, and so that
  31.     we can verify documents converted from other authoring
  32.     systems such as GNU info, Andew's EZ, or FrameMaker.
  33.  
  34.     * We need to be able to distribute documents and document
  35.     elements in other formats, including raw 8 bit data streams.
  36.     The SGML NOTATION feature falls short of providing and
  37.     adequate mechanism.
  38.  
  39.     * The UDI syntax doesn't match the SGML attribute syntax.
  40.     There are problems with quoting out-of-band characters, and
  41.     the length of complex UDI's may exceed SGML limits and/or
  42.     line-length limits of transport mechanisms. Also, the
  43.     terse syntax of UDI's conflicts with the goal that they
  44.     be human-readable.
  45.  
  46. This is a proposed architecture for global hypertext, addressing
  47. the issues raised by the WWW project, but using the MIME architecture.
  48.  
  49. We define a new subtype of the MIME multipart content type called
  50. x-HTDOC. The syntax is the same as multipart/mixed, but the semantics
  51. are that of a WWW client: the first part is displayed, and the rest
  52. represent links to other documents or other elements of this document.
  53.  
  54. Then we define a new subtype of the MIME text content type called
  55. x-HTML. This is an SGML markup language using the default SGML declaration
  56. (i.e. the reference concrete syntax, default processing limits, etc.)
  57. and the HTML DTD (included below).
  58.  
  59. ---
  60.  
  61. <!-- This DTD was produced by DeveGram on Tue Jun  2 18:58:16 1992 -->
  62. <!-- and hand-edited by connolly@convex.com -->
  63.  
  64. <!--     Parameter Entities       -->
  65.  
  66. <!--      Terminal symbols        -->
  67.  
  68. <!ENTITY % words "#PCDATA" >
  69.  
  70. <!--    Non-ELEMENT symbols       -->
  71.  
  72. <!ENTITY % inline    "%words | A" >
  73. <!ENTITY % text         "%inline | P" >
  74. <!ENTITY % heading "H1|H2|H3|H4|H5|H6" >
  75.  
  76. <!ENTITY lt "<">
  77. <!ENTITY gt ">">
  78. <!ENTITY amp "&">
  79.  
  80. <!ENTITY lt. "<">
  81. <!ENTITY gt. ">">
  82. <!ENTITY amp. "&">
  83.  
  84. <!--     Document structure       -->
  85.  
  86. <!ELEMENT html    O O  (TITLE, NEXTID?, ISINDEX?, section+, ADDRESS?)>
  87.  
  88. <!ELEMENT TITLE    - -  (%inline)+>
  89. <!ELEMENT ADDRESS - - (%text)+>
  90.  
  91. <!ELEMENT NEXTID - O EMPTY >
  92. <!ATTLIST NEXTID N NUMBER #IMPLIED>
  93.  
  94. <!ELEMENT ISINDEX - O EMPTY >
  95.  
  96.  
  97. <!ELEMENT section O O ((%heading)?,
  98.             (
  99.             %text |
  100.             section |
  101.             MENU |
  102.             UL |
  103.             OL |
  104.             DIR |
  105.             DL)+)>
  106.  
  107. <!ELEMENT (H1|H2|H3|H4|H5|H6)    - -  (%inline) >
  108.  
  109. <!ELEMENT P    - O  EMPTY -- paragraph SEPARATOR -->
  110.  
  111.  
  112. <!ELEMENT A    - -  (%inline)+>
  113. <!ATTLIST A
  114.     NAME CDATA #IMPLIED
  115.     PART ENTITY #IMPLIED >
  116.  
  117. <!ELEMENT MENU    - -  (LI+)>
  118.  
  119. <!ELEMENT UL    - -  (LI+)>
  120.  
  121. <!ELEMENT OL    - -  (LI+)>
  122.  
  123. <!ELEMENT DIR    - -  (LI+)>
  124.  
  125. <!ELEMENT LI    - O  (%text)+>
  126.  
  127. <!ELEMENT DL    - -  ((DT, DD)+)>
  128.  
  129. <!ELEMENT DT    - O  (%inline)+>
  130.  
  131. <!ELEMENT DD    - O  (%text)+>
  132.  
  133. ---
  134.  
  135. An HTML document would use external entities to reference other parts
  136. of the multipart message. The system identifier matches the
  137. Content-Id field of the intended part. The content-type of the indicated
  138. part could be image, audio, or video for multimedia inclusions; text for
  139. quotes etc., or message/external-body for references to other documents.
  140.  
  141. MIME defines access-types for local-file and anon-ftp. We could define
  142. x-HTTP, x-NEWS, x-WAIS, and the other UDI access types.
  143.  
  144. Within HTML documents, SGML IDREFs and IDs are used to reference and define
  145. elements of a document. (I think HYTIME defines a way to reference elements
  146. without explicit IDs.)
  147.  
  148.  
  149. The next part of this message is a default.html from the WWW
  150. distribution adapted to use the conventions here.
  151.  
  152. It should interoperate with existing MIME systems,
  153. though they will not be able to do anyting intelligent with HTML.
  154.  
  155. ---
  156. Content-Type: multipart/x-HTDOC; boundary=cut-here
  157.  
  158. --cut-here
  159. Content-Type: text/x-HTML
  160.  
  161. <!DOCTYPE HTML SYSTEM 
  162. [
  163. <!ENTITY part1 SDATA "QuickGuide.html">
  164. <!ENTITY part2 SDATA "http://info.cern.ch/hypertext/WWW/TheProject.html">
  165. <!ENTITY part3 SDATA "http://crnvmc.cern.ch./WHO">
  166. <!ENTITY part4 SDATA "http://crnvmc.cern.ch./FIND/yellow?">
  167. <!ENTITY part5 SDATA "http://crnvmc.cern.ch./FIND/jaune?">
  168. <!ENTITY part6 SDATA "http://crnvmc.cern.ch./FIND">
  169. <!ENTITY part7 SDATA "http://crnvmc.cern.ch/NEWS/?">
  170. <!ENTITY part8 SDATA "http://crnvmc.cern.ch./NEWS/cern">
  171. <!ENTITY part9 SDATA "http://crnvmc.cern.ch./NEWS/vmnews">
  172. <!ENTITY part10 SDATA "http://crnvmc.cern.ch/NEWS/student">
  173. <!ENTITY part11 SDATA "http://info.cern.ch/hypertext/DataSources/NewsFromVM/Overview.html">
  174. <!ENTITY part12 SDATA "http://info.cern.ch/hypertext/DataSources/News/Overview.html">
  175. <!ENTITY part13 SDATA "http://info.cern.ch/hypertext/DataSources/bySubject/Overview.html">
  176. <!ENTITY part14 SDATA "http://info.cern.ch./hypertext/DataSources/Overview.html">
  177. <!ENTITY part15 SDATA "http://slacvm.slac.stanford.edu./FIND/spires">
  178. <!ENTITY part16 SDATA "http://crnvmc.cern.ch/FIND/DESY?">
  179. <!ENTITY part17 SDATA "http://info.cern.ch:8001/archive.orst.edu:9000/archie-orst.edu">
  180. <!ENTITY part18 SDATA "http://iicm.tu-graz.ac.at./jargon">
  181. <!ENTITY part19 SDATA "http://info.cern.ch./hypertext/Products/WAIS/Sources/Overview.html">
  182. <!ENTITY part20 SDATA "http://info.cern.ch/rpc/doc/User/UserGuide.html">
  183. <!ENTITY part21 SDATA "http://otax.tky.hut.fi/tky/default.html">
  184. <!ENTITY part22 SDATA "gopher://gopher.micro.umn.edu:70/11/Other%20Gopher%20and%20Information%20Servers">
  185. <!ENTITY part23 SDATA "http://info.cern.ch./hypertext/WWW/LineMode/Defaults/default.html">
  186. ]>
  187. <TITLE>CERN Information</TITLE>
  188. <NEXTID N=10>
  189. <SECTION><H1>CERN Information - Select by number</H1>
  190. <DL>
  191. <DT><A PART="part1">Help</A>
  192. <DD>On this program, or the
  193. <A PART="part2">World-Wide Web project</A>.
  194. <DT><A PART="part3" NAME=2>Phone book</A>
  195. <DD>People, phone numbers, accounts and email addresses.
  196. See also the analytical
  197. <A PART="part4" NAME=yellow>Yellow Pages</A>, or
  198. the same index in French :
  199. <A PART="part5" NAME=jaune>Pages Jaunes</A>.
  200. <DT><A PART="part6" NAME=1>"XFIND" index</A>
  201. <DD>Index of computer centre documentation, newsletters, news,
  202. help files, etc...
  203. <DT><A PART="part7" NAME=groups>News</A>
  204. <DD>A complete list of all public CERN news groups, such as
  205. <A PART="part8" NAME=3>news from the CERN User's
  206. Office</A>,<A PART="part9" NAME=4>
  207. CERN computer center news</A>,<A PART="part10">
  208. student news</A>. See also <A PART="part11" NAME=5>private
  209. groups</A> and <A PART="part12" NAME=inews>Internet
  210. news</A>.
  211. </dl>
  212. </section>
  213. <section>
  214. <SECTION><H2>From other sites</h2>
  215. See online data by
  216. <A PART="part13" NAME=subject>subject</A>,
  217. pointers to
  218. <A PART="part14">other forms of online data</a>, and the following specific databases:
  219. <DL>
  220. <DT><A PART="part15" NAME=spires>SLAC SPIRES</A>
  221. <DD>The High Energy Physics preprint index at Stanford Linear Accelerator, California.
  222. (This is the same information avialable via the QSPIRES facility on BITNET.
  223. Include the word "FIND" as the first keyword, eg: K FIND AUTHOR FRED.).
  224. <DT><A PART="part16" NAME=desy>DESY documents</a>
  225. <DD>Documents and help files from the DESY lab in Hamburg.
  226. <DT><A PART="part17" NAME=archie>
  227. Archie</a>
  228. <DD>An index of almost everything available by "anonymous FTP".
  229. <DT><A PART="part18" NAME=7>Hacker Jargon</a>
  230. <DD>An index to a cross-referenced set of hacker terms. A demonstration
  231. of the WWW gateway to the Graz Technical University Hyper-G database.
  232. <DT><A PART="part19" NAME=9>W.A.I.S.</a>
  233. <DD>All kinds of information available from "Wide Area Information Servers".
  234. <DT><A PART="part20" NAME=6>CERN RPC</A>
  235. <DD>The user guide for the RPC system developed in CERN CN division
  236. (not Sun/RPC). This is an example of documentation (partially) converted
  237. into hypertext.
  238. <DT><A PART="part21" NAME=hut>Helsinki</a>
  239. <DD>Helsinki Technical University information service (Mostly Finnish).
  240. <DT><A PART="part22" NAME=gopher>Gophers</a>
  241. <DD>Campus-wide information systems using "Gopher" software. (Requires www version 1.1 or higher)
  242. </DL>
  243. (This page may be an out of date copy. See the
  244. <A PART="part23" NAME=latest>latest version</a>.)
  245.  
  246. --cut-here
  247. Content-id: QuickGuide.html
  248. Content-type: message/external-body
  249.     ;access-type=x-relative
  250.     ;name="QuickGuide.html"
  251.  
  252. Content-Type: message
  253.  
  254.  
  255. --cut-here
  256. Content-id: http://info.cern.ch/hypertext/WWW/TheProject.html
  257. Content-type: message/external-body
  258.     ;access-type=x-HTTP
  259.     ;site=info.cern.ch
  260.     ;name=/hypertext/WWW/TheProject.html
  261.  
  262. Content-Type: message
  263.  
  264.  
  265. --cut-here
  266. Content-id: http://crnvmc.cern.ch./WHO
  267. Content-type: message/external-body
  268.     ;access-type=x-HTTP
  269.     ;site=crnvmc.cern.ch.
  270.     ;name=/WHO
  271.  
  272. Content-Type: message
  273.  
  274.  
  275. --cut-here
  276. Content-id: http://crnvmc.cern.ch./FIND/yellow?
  277. Content-type: message/external-body
  278.     ;access-type=x-HTTP
  279.     ;site=crnvmc.cern.ch.
  280.     ;name=/FIND/yellow?
  281.  
  282. Content-Type: message
  283.  
  284.  
  285. --cut-here
  286. Content-id: http://crnvmc.cern.ch./FIND/jaune?
  287. Content-type: message/external-body
  288.     ;access-type=x-HTTP
  289.     ;site=crnvmc.cern.ch.
  290.     ;name=/FIND/jaune?
  291.  
  292. Content-Type: message
  293.  
  294.  
  295. --cut-here
  296. Content-id: http://crnvmc.cern.ch./FIND
  297. Content-type: message/external-body
  298.     ;access-type=x-HTTP
  299.     ;site=crnvmc.cern.ch.
  300.     ;name=/FIND
  301.  
  302. Content-Type: message
  303.  
  304.  
  305. --cut-here
  306. Content-id: http://crnvmc.cern.ch/NEWS/?
  307. Content-type: message/external-body
  308.     ;access-type=x-HTTP
  309.     ;site=crnvmc.cern.ch
  310.     ;name=/NEWS/?
  311.  
  312. Content-Type: message
  313.  
  314.  
  315. --cut-here
  316. Content-id: http://crnvmc.cern.ch./NEWS/cern
  317. Content-type: message/external-body
  318.     ;access-type=x-HTTP
  319.     ;site=crnvmc.cern.ch.
  320.     ;name=/NEWS/cern
  321.  
  322. Content-Type: message
  323.  
  324.  
  325. --cut-here
  326. Content-id: http://crnvmc.cern.ch./NEWS/vmnews
  327. Content-type: message/external-body
  328.     ;access-type=x-HTTP
  329.     ;site=crnvmc.cern.ch.
  330.     ;name=/NEWS/vmnews
  331.  
  332. Content-Type: message
  333.  
  334.  
  335. --cut-here
  336. Content-id: http://crnvmc.cern.ch/NEWS/student
  337. Content-type: message/external-body
  338.     ;access-type=x-HTTP
  339.     ;site=crnvmc.cern.ch
  340.     ;name=/NEWS/student
  341.  
  342. Content-Type: message
  343.  
  344.  
  345. --cut-here
  346. Content-id: http://info.cern.ch/hypertext/DataSources/NewsFromVM/Overview.html
  347. Content-type: message/external-body
  348.     ;access-type=x-HTTP
  349.     ;site=info.cern.ch
  350.     ;name=/hypertext/DataSources/NewsFromVM/Overview.html
  351.  
  352. Content-Type: message
  353.  
  354.  
  355. --cut-here
  356. Content-id: http://info.cern.ch/hypertext/DataSources/News/Overview.html
  357. Content-type: message/external-body
  358.     ;access-type=x-HTTP
  359.     ;site=info.cern.ch
  360.     ;name=/hypertext/DataSources/News/Overview.html
  361.  
  362. Content-Type: message
  363.  
  364.  
  365. --cut-here
  366. Content-id: http://info.cern.ch/hypertext/DataSources/bySubject/Overview.html
  367. Content-type: message/external-body
  368.     ;access-type=x-HTTP
  369.     ;site=info.cern.ch
  370.     ;name=/hypertext/DataSources/bySubject/Overview.html
  371.  
  372. Content-Type: message
  373.  
  374.  
  375. --cut-here
  376. Content-id: http://info.cern.ch./hypertext/DataSources/Overview.html
  377. Content-type: message/external-body
  378.     ;access-type=x-HTTP
  379.     ;site=info.cern.ch.
  380.     ;name=/hypertext/DataSources/Overview.html
  381.  
  382. Content-Type: message
  383.  
  384.  
  385. --cut-here
  386. Content-id: http://slacvm.slac.stanford.edu./FIND/spires
  387. Content-type: message/external-body
  388.     ;access-type=x-HTTP
  389.     ;site=slacvm.slac.stanford.edu.
  390.     ;name=/FIND/spires
  391.  
  392. Content-Type: message
  393.  
  394.  
  395. --cut-here
  396. Content-id: http://crnvmc.cern.ch/FIND/DESY?
  397. Content-type: message/external-body
  398.     ;access-type=x-HTTP
  399.     ;site=crnvmc.cern.ch
  400.     ;name=/FIND/DESY?
  401.  
  402. Content-Type: message
  403.  
  404.  
  405. --cut-here
  406. Content-id: http://info.cern.ch:8001/archive.orst.edu:9000/archie-orst.edu
  407. Content-type: message/external-body
  408.     ;access-type=x-HTTP
  409.     ;site=info.cern.ch
  410.     ;port=8001
  411.     ;name=/archive.orst.edu:9000/archie-orst.edu
  412.  
  413. Content-Type: message
  414.  
  415.  
  416. --cut-here
  417. Content-id: http://iicm.tu-graz.ac.at./jargon
  418. Content-type: message/external-body
  419.     ;access-type=x-HTTP
  420.     ;site=iicm.tu-graz.ac.at.
  421.     ;name=/jargon
  422.  
  423. Content-Type: message
  424.  
  425.  
  426. --cut-here
  427. Content-id: http://info.cern.ch./hypertext/Products/WAIS/Sources/Overview.html
  428. Content-type: message/external-body
  429.     ;access-type=x-HTTP
  430.     ;site=info.cern.ch.
  431.     ;name=/hypertext/Products/WAIS/Sources/Overview.html
  432.  
  433. Content-Type: message
  434.  
  435.  
  436. --cut-here
  437. Content-id: http://info.cern.ch/rpc/doc/User/UserGuide.html
  438. Content-type: message/external-body
  439.     ;access-type=x-HTTP
  440.     ;site=info.cern.ch
  441.     ;name=/rpc/doc/User/UserGuide.html
  442.  
  443. Content-Type: message
  444.  
  445.  
  446. --cut-here
  447. Content-id: http://otax.tky.hut.fi/tky/default.html
  448. Content-type: message/external-body
  449.     ;access-type=x-HTTP
  450.     ;site=otax.tky.hut.fi
  451.     ;name=/tky/default.html
  452.  
  453. Content-Type: message
  454.  
  455.  
  456. --cut-here
  457. Content-id: gopher://gopher.micro.umn.edu:70/11/Other%20Gopher%20and%20Information%20Servers
  458. Content-type: message/external-body
  459.     ;access-type=x-gopher
  460.     ;site=gopher.micro.umn.edu
  461.     ;port=70
  462.     ;type=11
  463.     ;selector="Other Gopher and Information Servers"
  464.  
  465. Content-Type: message
  466.  
  467.  
  468. --cut-here
  469. Content-id: http://info.cern.ch./hypertext/WWW/LineMode/Defaults/default.html
  470. Content-type: message/external-body
  471.     ;access-type=x-HTTP
  472.     ;site=info.cern.ch.
  473.     ;name=/hypertext/WWW/LineMode/Defaults/default.html
  474.  
  475. Content-Type: message
  476. --cut-here--
  477.  
  478. ---
  479.  
  480. Here's the perl script I used to convert default.html into
  481. the above message. It's full of gross hacks, but it worked
  482. this evening.
  483.  
  484. ---
  485.  
  486. #!/usr/local/bin/perl
  487.  
  488. print "Content-Type: multipart/x-HTDOC; boundary=cut-here\n\n";
  489. print "--cut-here\n";
  490. print "Content-Type: text/x-HTML\n\n";
  491. print "<!DOCTYPE HTML SYSTEM \n[\n";
  492.  
  493. $o = 0;
  494. $/ = ">";
  495.  
  496. while(<>){
  497.     s/(<A[^>]*>)/&fix_anchor($1)/ige;
  498.     s/<NEXTID\s*(\d*)\s*>/<NEXTID N=$1>/g;
  499.     if(/<H(\d)/){
  500.     local($n) = $1;
  501.     if($n>$o) { $rep = "<SECTION>"; }
  502.     else { $rep = "</SECTION><SECTION>"; }
  503.         s/(<H\d)/$rep$1/g;
  504.     $o = $n;
  505.     }
  506.     $doc .= $_;
  507. }
  508.  
  509. @entities = @anchors;
  510. while(@entities){
  511.     local($id) = shift(@entities);
  512.     local($_) = shift(@entities);
  513.     local($name) = shift(@entities);
  514.     local($type) = shift(@entities);
  515.  
  516.     print "<!ENTITY part$id SDATA \"$_\">\n";
  517. }
  518.  
  519. print "]>\n", $doc;
  520.  
  521. while(@anchors){
  522.     local($id) = shift(@anchors);
  523.     local($_) = shift(@anchors);
  524.     local($name) = shift(@anchors);
  525.     local($type) = shift(@anchors);
  526.     local($access_type);
  527.  
  528.     print "\n\n--cut-here\n";
  529.     print "Content-id: $_\n";
  530.     print "Content-type: message/external-body\n";
  531.  
  532.     $access_type = $1 if s/^(\w+)://;
  533.     if(s/#([^#]+)$//){
  534.     print "\t;x-element-id=\"$1\"\n";
  535.     }
  536.  
  537.     if($access_type =~ /file/i){
  538.     print "\t;access-type=LOCAL-FILE\n";
  539.     print "\t;name=$_\n";
  540.     }elsif($access_type =~ /http/i){
  541.     print "\t;access-type=x-HTTP\n";
  542.     if(s-//([^:/]+)--){
  543.         print "\t;site=$1\n";
  544.         print "\t;port=$1\n" if s/^:(\d+)//;
  545.     }
  546.     &unescape;
  547.     print "\t;name=$_\n";
  548.     }elsif($access_type =~ /news/i){
  549.     print "\t;access-type=x-news\n";
  550.     &unescape;
  551.     if(/@/){
  552.         print "\t;message-id=$_\n";
  553.     }else{
  554.         print "\t;group=$_\n";
  555.     }
  556.     }elsif($access_type =~ /telnet/i){
  557.     print "\t;access-type=x-telnet\n";
  558.     &unescape;
  559.     print "\t;user=$1\n" if s/^(.*)@//;
  560.     print "\t;port=$1\n" if s/:(.*)$//;
  561.     print "\t;site=$_\n";
  562.     }elsif($access_type =~ /gopher/i){
  563.     print "\t;access-type=x-gopher\n";
  564.     if(s-^//([^:/]+)--){
  565.         print "\t;site=$1\n";
  566.         print "\t;port=$1\n" if s/:(\d+)//;
  567.     }
  568.     print "\t;type=$1\n" if s-^/(\d+)/--;
  569.     &unescape;
  570.     print "\t;selector=\"$_\"\n";
  571.     }elsif($access_type =~ /wais/i){
  572.     print "\t;access-type=x-wais\n";
  573.     if(s-//([^:/]+)--){
  574.         print "\t;site=$1\n";
  575.         print "\t;port=$1\n" if s/:(\d+)//;
  576.     }
  577.     if(m-^/-){
  578.         print "\t;type=$1\n" if s-^/(\w+)--;
  579.         print "\t;size=$1\n" if s-^/(\d+)--;
  580.         &unescape;
  581.         print "\t;path=\"$_\"\n";
  582.     }else{
  583.         &unescape;
  584.         print "\t;words=\"$1\"\n" if /\?(.*)/;
  585.     }
  586.     }elsif($access_type eq ""){
  587.     print "\t;access-type=x-relative\n";
  588.     &unescape;
  589.     print "\t;name=\"$_\"\n";
  590.     }else{
  591.     warn "unknown access type: $access_type in $_";
  592.     }
  593.  
  594.     print "\nContent-Type: message\n";
  595. }
  596.  
  597. print "--cut-here--\n";
  598.  
  599. sub unescape{
  600.     s/%(\w\w)/sprintf("%c",hex($1))/ge;
  601. }
  602.  
  603. sub fix_anchor{
  604.     local($_) = @_;
  605.     local($name, $href, $type);
  606.     $href = $1 if /HREF\s*=\s*(\S+)/i;
  607.     return $_ unless $href;
  608.     $href =~ s/>$//;
  609.  
  610.     $name = $1 if /NAME\s*=\s*(\S+)/i;
  611.     $type = $1 if /TYPE\s*=\s*(\S+)/i;
  612.  
  613.     $content_id{$href} = $content_id++ unless $content_id{$href};
  614.     push(@anchors, $content_id, $href, $name, $type);
  615.     local($ret) = "<A PART=\"part$content_id\"";
  616.     $ret .= " NAME=$name" if $name;
  617.     $ret .= ">";
  618.     return $ret;
  619. }
  620.  
  621. -----